package com.offdissys.common.core.lang;

import cn.hutool.core.util.ObjectUtil;
import com.offdissys.common.core.constant.ResultEnumInterface;
import com.offdissys.common.core.exception.CommException;
import org.springframework.lang.Nullable;

/**
 * @author ZhangHaiWen
 * @title: Assert
 * @projectName parent
 * @description: TODO
 * @date 2022/3/1816:21
 */
public abstract class Assert {

    /**
     * 断言是否为真，如果为 {@code false} 抛出给定的异常<br>
     *
     * <pre class="code">
     * Assert.isTrue(i &gt; 0, IllegalArgumentException::new);
     * </pre>
     *
     * @param <X>        异常类型
     * @param expression 布尔值
     * @param e   指定断言不通过时抛出的异常
     * @throws X if expression is {@code false}
     */
    public static <X extends Throwable> void isTrue(boolean expression, ResultEnumInterface e) throws X {
        if (false == expression) {
            throw new CommException(e);
        }
    }

    /**
     * 断言是否为真，如果为 {@code false} 抛出给定的异常<br>
     *
     * <pre class="code">
     * Assert.isTrue(i &gt; 0, IllegalArgumentException::new);
     * </pre>
     *
     * @param <X>        异常类型
     * @param expression 布尔值
     * @param e   指定断言不通过时抛出的异常
     * @throws X if expression is {@code false}
     */
    public static <X extends Throwable> void isTrue(boolean expression, RuntimeException e) throws X {
        if (false == expression) {
            throw e;
        }
    }

    /**
     * 断言是否为真，如果为 {@code false} 抛出给定的异常<br>
     *
     * <pre class="code">
     * Assert.isTrue(i &gt; 0, IllegalArgumentException::new);
     * </pre>
     *
     * @param <X>        异常类型
     * @param expression 布尔值
     * @param e   指定断言不通过时抛出的异常
     * @throws X if expression is {@code false}
     */
    public static <X extends Throwable> void isTrue(boolean expression, CommException e) throws X {
        if (false == expression) {
            throw e;
        }
    }

    /**
     * 断言是否为真，如果 {@code obj}为空 抛出给定的异常<br>
     *
     * <pre class="code">
     * Assert.isNull(i &gt; 0, IllegalArgumentException::new);
     * </pre>
     *
     * @param <X>        异常类型
     * @param obj 判断对象
     * @param e   指定断言不通过时抛出的异常
     * @throws X if expression is {@code false}
     */
    public static <X extends Throwable> void isNull(@Nullable Object obj, CommException e) throws X {
        if (ObjectUtil.isNull(obj)) {
            throw e;
        }
    }



}
